﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ClassCommon
{
    public class GetClassAssociateInfoHelper
    {
        /// <summary>
        /// 帮助累
        /// </summary>
        private ExcelHelper _excelHelper;
        /// <summary>
        /// excel文件路径
        /// </summary>
        private string _filePath;

        /// <summary>
        /// excel对应的数据表
        /// </summary>
        private DataTable _dt;

        public GetClassAssociateInfoHelper(string filePath)
        {
            this._filePath = filePath;
            _excelHelper = new ExcelHelper(this._filePath);
            this._dt = this._excelHelper.ExcelToDataTable(string.Empty, true);
        }

        /// <summary>
        /// 获得老师信息
        /// </summary>
        /// <returns></returns>
        public List<string> GetTeachers()
        {
            if (this._dt == null) throw new ArgumentException("dt is null");

            StringBuilder teachersBuilder = new StringBuilder();
            List<string> teachers = new List<string>();
            for (int c = 0; c < this._dt.Columns.Count; c++)
            {
                string colname = this._dt.Columns[c].ColumnName;
                if (colname.Contains("Column"))
                {
                    foreach (DataRow row in this._dt.Rows)
                    {
                        string teacherName = row[c].ToString();
                        if (!teachers.Contains(teacherName))
                        {
                            teachers.Add(teacherName);
                        }
                    }
                }
            }

            return teachers;
        }

        /// <summary>
        /// 获得班级信息
        /// </summary>
        /// <returns></returns>
        public List<string> GetClasses()
        {
            if (this._dt == null) throw new ArgumentException("dt is null");

            List<string> classesList = new List<string>();
            foreach (DataRow row in this._dt.Rows)
            {
                // 每一行的第一列联合起来就是班级信息
                string className = row[1].ToString();
                classesList.Add(className);
            }


            return classesList;
        }

        /// <summary>
        /// 获取科目信息
        /// </summary>
        /// <returns></returns>
        public List<string> GetCourses()
        {
            if (this._dt == null) throw new ArgumentException("dt is null");

            List<string> couresList = new List<string>();
            for (int c = 2; c < this._dt.Columns.Count; c++)
            {
                string colName = this._dt.Columns[c].ToString();
                if (!colName.Contains("Column"))
                {
                    couresList.Add(colName);
                }
            }
            return couresList;
        }


        /// <summary>
        /// 获得年级信息，一般一个excel模板，只包含一个年级的排课。
        /// </summary>
        /// <returns></returns>
        public string GetGrade()
        {
            if (this._dt == null) throw new ArgumentException("dt is null");

            return this._dt.Rows[1][0].ToString();
        }


        /// <summary>
        /// 获得老师和课程的关系
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, List<string>> GetRelationWithTeacherAndCourse()
        {
            int cols = this._dt.Columns.Count;
            // excel格式稳定的话，colIndex就是从2开始。
            Dictionary<string, List<string>> dicts = new Dictionary<string, List<string>>();
            for (int c = 2; c < cols; c++)
            {
                if (!this._dt.Columns[c].ColumnName.Contains("Column"))
                {
                    // 说明是课名。
                    // 当前索引偏移+1，在进行row循环，取此纵列，即可拿到老师的姓名
                    int colOffsex = c + 1;
                    string courseName = this._dt.Columns[c].ColumnName; // 课程名
                    List<string> tnames = new List<string>();
                    foreach (DataRow row in this._dt.Rows)
                    {
                        string teacherName = row[colOffsex].ToString();
                        if (!tnames.Contains(teacherName))
                            tnames.Add(teacherName);
                    }

                    // 一门课对应的老师就出来了。
                    dicts.Add(courseName, tnames);
                }
            }

            return dicts;
        }


        /// <summary>
        /// 获得排班数据
        /// 排班数据是指，在excel表格中，除了表头外。
        /// 一行数据代表了某一个班级在一周内上课的信息。
        /// 上课的信息包含了上课的老师，课程，以及上课的条件约束。
        /// </summary>
        public Dictionary<string, List<SchedulingClassModel>> GetScheduleClassData()
        {
            /**
             
             * 排班的数据，以班级为单位。
             * 每个班级又分课程
             * 课程对应老师
             * 老师对应排课条件
             * 
             * 
             * ****** 所有的 excel 抽取算法，都是基于 excel格式稳定的前提之下。格式变换了，就不能正确的提取想要的数据了。
             */

            // 记录列集合，拿去课程名
            DataColumnCollection cols = this._dt.Columns;
            int colsCount = cols.Count;

            // 记录行集合，抽取班级、老师、上课条件关联。
            DataRowCollection rows = this._dt.Rows;
            int rowsCount = rows.Count;

            /**
             *  1. 班级是每一个行的第 1 列 index = 1
             *  2. 从第班级列开始，索引 % 2 == 0 的就是上课条件约束，此列的列名就是课程名。
             *  3. 每一行的列名包括 Column 的单元格数据就是老师的名字。
             */

            // key 班级名  list 每个item一周，老师和key(班级)、课程、上课条件的模型
            Dictionary<string, List<SchedulingClassModel>> dicts = new Dictionary<string, List<SchedulingClassModel>>();


            foreach (DataRow row in rows)
            {
                // 获得班级名
                string className = row[1].ToString();
                List<SchedulingClassModel> list = new List<SchedulingClassModel>();
                for (int i = 2; i < colsCount; i++)
                {
                    if (i % 2 == 0)
                    {
                        SchedulingClassModel sm = new SchedulingClassModel();
                        // 获得课程名
                        sm.courseName = cols[i].ColumnName;
                        // 排课条件
                        sm.condition = row[i].ToString();
                        // 老师名
                        sm.teacherName = row[++i].ToString();

                        list.Add(sm);
                    }
                }

                // 一行，就是一个班级的排课数据
                dicts.Add(key: className, value: list);
            }

            return dicts;
        }


    }

    /// <summary>
    /// 排班model
    /// </summary>
    public class SchedulingClassModel
    {
        /// <summary>
        /// 排课的名称
        /// </summary>
        public string courseName { get; set; }
        /// <summary>
        /// 排课的条件
        /// </summary>
        public string condition { get; set; }
        /// <summary>
        /// 被排课的老师
        /// </summary>
        public string teacherName { get; set; }
    }
}
